#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <assert.h>
#include <unistd.h>
int main()
{
  pid_t id=fork();
  if(id==0)
  {
    int cnt=10;
    while(cnt)
    {
      printf("child running pid : %d ,ppid %d ,cnt %d\n",getpid(),getppid(),cnt--);
      sleep(3);
    }
    exit(10);
  }
  
  int status=0;
  //非阻塞轮询等待
 while(1)
 {  
  pid_t ret=waitpid(id,&status,WNOHANG);//WNOWAIT: 非阻塞 -> 子进程没有退出，父进程检测之后立即返回
  if(ret == 0)
  {
    printf("wait done, but child is running ...\n");
    //waitpid 等待成功 && 子进程没退出
    //子进程没有退出，waitpid没有等待失败，只是检测到了子进程没退出
    //就相当于张三给李四打电话 李四还没好，但是张三打电话成功了
  }
  else if(ret>0)
  {
    //1、等待waitpid成功 && 子进程退出
    printf("wait success : exit code :%d,sig : %d\n ",(status>>8) & 0xff,status & 0x7f);
    break;
  }
  else
  {
    //waitpid调用失败 由于参数传错比如等待不属于自己的子进程
    printf("waitpid call failed\n");
    break;
  }
  sleep(1);
 }
  return 0;
}
